<html>
	<head>
		<title>Release notes Version 1.1</title>
		<meta http-equiv="Content-Language" content="en-us">
		<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
		<link rel="stylesheet" type="text/css" href="Meta.css">
	</head>
	<body>
		<H1 id="heading1"><SPAN>Release notes</SPAN></H1>
		<P><SPAN>The canonical version of this file is on the Animate Arts Wiki: <A href="http://dada.cs.northwestern.edu">http://dada.cs.northwestern.edu</A>.</SPAN></P>
		<H1><SPAN>Version 1.3</SPAN></H1>
		<H2 id="heading0"><SPAN>New features</SPAN></H2>
		<H4 id="heading12"><SPAN>Core functionality</SPAN></H4>
		<UL>
			<LI>
				<SPAN>Procedure arguments can now be typed; interpreter will do automatic 
  type checking. </SPAN>
			<LI>
				<SPAN>Support for optional and keyword arguments a la Common Lisp, 
  although with a different syntax (see reference manual) </SPAN>
			<LI>
				<SPAN>Added declare form </SPAN>
			<LI>
				<SPAN>Added declaration for tail-call optimization (scoped to file) 
</SPAN>
			<LI>
				<SPAN>Lame support for multiple return values (incl. values and 
  call-with-values procedures from scheme, plus receive macro) </SPAN>
			<LI>
				<SPAN>Support for per-namespace and per-file fluids </SPAN>
			<LI>
				<SPAN>Indexed properties now supported (as if the were methods with one 
  argument)</SPAN></LI></UL>
		<H4 id="heading15"><SPAN>Built-in procedures</SPAN></H4>
		<UL>
			<LI>
				<SPAN>Support for most of the SRFI-1 list library </SPAN>
			<LI>
				<SPAN>Generic arithmetic supports Direct3D vector and matrix types </SPAN>
			<LI>
				<SPAN>min and max are now properly polymorphic </SPAN>
			<LI>
				<SPAN>Added single, double, int, and byte to provide easy type coersion 
  </SPAN>
			<LI>
				<SPAN>Added assq and assv; assoc now uses equal? predicate </SPAN>
			<LI>
				<SPAN>Break renamed to breakpoint to allow break to a SRFI-1 list 
  function</SPAN></LI></UL>
		<H4 id="heading16"><SPAN>Syntax</SPAN></H4>
		<UL>
			<LI>
				<SPAN>Added ellipsis as sugar for apply, i.e. [+ 1 2 list ...] means 
  [apply + 1 2 list] </SPAN>
			<LI>
				<SPAN>Make macro no longer requires constructor arguments to be bracketed 
  </SPAN>
			<LI>
				<SPAN>Reader supports "F" syntax for single float constants </SPAN>
			<LI>
				<SPAN>Reader now accepts any kind of double quote (left, right, or 
  centered) </SPAN>
			<LI>
				<SPAN>Better error checking and more descriptive eror messages for syntax 
  errors </SPAN></LI></UL>
		<P><A name="heading17"></A>
			<H4 id="heading17"><SPAN>Editor/IDE</SPAN></H4>
			<UL>
				<LI>
					<SPAN>S-expression operations nowfully understand, quote, quasiquote, 
  unquote, etc. symbols, i.e. ',@foo and so on. </SPAN>
				<LI>
					<SPAN>Editor now does paranoid file saving (saves to file file, then 
  rename) because of reports of files being truncated to zero length </SPAN>
				<LI>
					<SPAN>Support for finding all references to a symbol </SPAN>
				<LI>
					<SPAN>Emacs-like isearch (using F3 instead of ^S) </SPAN>
				<LI>
					<SPAN>Event log now limited to 500 entries </SPAN>
				<LI>
					<SPAN>Status bar now shows loading packages</SPAN></LI></UL>
		<P><A name="heading18"></A>&nbsp;</P>
		<H2 id="heading18"><SPAN>Bugs and misfeatures fixed</SPAN></H2>
		<UL>
			<LI>
				<SPAN>Methods print more legibly </SPAN>
			<LI>
				<SPAN>Listener forces jitting of most of editor during startup to speed up 
  typing and execution of first expression </SPAN>
			<LI>
				<SPAN>ScrollToEnd() in listener now uses a different Win32 call that seems 
  to work better </SPAN>
			<LI>
				<SPAN>Editor now locks scrolling during bracket matching and autoindent 
  </SPAN>
			<LI>
				<SPAN>Package system now throws errors when you refer to a namespace with 
  no types in it </SPAN>
			<LI>
				<SPAN>SimpleClass compiles constructors properly when they have arguments 
  that are fields inherited from a parent that isn't of type Object. </SPAN>
			<LI>
				<SPAN>Paste previous command no longer inserts extra space at the 
  beginning of command. </SPAN>
			<LI>
				<SPAN>Fixed bug in EditSource that would mistakenly position cursor at an 
  easlier definition when the definition being searched for is a prefix of the 
  earlier definition </SPAN>
			<LI>
				<SPAN>More efficient number checking </SPAN>
			<LI>
				<SPAN>Automatic conversion from enums to integers blocked when assigning 
  fields and properties </SPAN>
			<LI>
				<SPAN>Certain primitives now list their required type as "Number" rather 
  than "Float". </SPAN>
			<LI>
				<SPAN>Type members can now be accessed (i.e. types within types) using 
  member special form or "." syntax </SPAN>
			<LI>
				<SPAN>Automatically created native namespaces now properly interened in 
  native namespace table</SPAN></LI></UL>
		<H2 id="heading13"><SPAN>Known bugs</SPAN></H2>
		<UL>
			<LI>
				<SPAN>Mutation of sub-members of members of objects doesn't work when the 
  member is a value type </SPAN>
			<LI>
				<SPAN>Editor scrolls when skipping over a close-bracket and another 
  expression is already highlighted</SPAN></LI></UL>
		<H1 id="heading14"><SPAN>Version 1.2</SPAN></H1>
		<H2 id="heading2"><SPAN>New features</SPAN></H2>
		<UL>
			<LI>
				<SPAN>Added set-fields procedure and make macro to make object creation 
  more elegant </SPAN>
			<LI>
				<SPAN>Beginnings of support for keyword arguments. Right now, keywords are 
  only supported by the set-fields procedure and the make macro. </SPAN>
			<LI>
				<SPAN>Tracing and event logging </SPAN>
			<LI>
				<SPAN>Support for programming the Meta.Writer class </SPAN>
			<LI>
				<SPAN>Added [print-fields: ...] clause to class macro </SPAN>
			<LI>
				<SPAN>Zooming in the editor </SPAN>
			<LI>
				<SPAN>Optional printing of intermediate results during files loads </SPAN>
			<LI>
				<SPAN>List functions now work on any IEnumerable object, at least for the 
  single-list-argument versions (i.e. map with one list but not two). </SPAN>
			<LI>
				<SPAN>Finally added print and print-line to write to the listener </SPAN>
			<LI>
				<SPAN>Faster member access, including call-site method 
caching</SPAN></LI></UL>
		<H2 id="heading3"><SPAN>Bugs fixed</SPAN></H2>
		<UL>
			<LI>
				<SPAN>Interaction Window no longer waits to scroll until it receives focus 
  </SPAN>
			<LI>
				<SPAN>Exports of imported namespaces now shadow any existing variables of 
  the same name in the importing package </SPAN>
			<LI>
				<SPAN>Debugger now shows correct source code locations for methods of 
  generic procedures </SPAN>
			<LI>
				<SPAN>Reader now understands escapes in strings </SPAN>
			<LI>
				<SPAN>SimpleClasses package no longer calls initialize twice for classes 
  whose parents are also user defined. </SPAN>
			<LI>
				<SPAN>Unwind-protect properly updates EvalStack </SPAN>
			<LI>
				<SPAN>Fixed loading of RTF files containing escaped 
  backslashes</SPAN>Version 1.2</LI></UL>
		<H1>Version 1.11</H1>
		<h2>New features</h2>
		<ul>
			<li>
				<b>SimpleClasses package<br>
				</b>
			Provides a macro for compiling new class types.
			<li>
				<b>Improved performance on member accesses</b>
			<li>
				<b>Direct support for events<br>
				</b>
			Events are now wrapped as first-class objects with Add, Remove, and Invoke 
			methods.&nbsp; Handlers may also be added to them using the assignment 
			(&#8592;) syntax.&nbsp; Meta procedures may be provided as handlers; the system 
			will automatically wrap them with the appropriate delegate type.
			<li>
				<b>Support for coercion of procedures to delegate types<br>
				</b>Procedures may not be converted to delegates using: [<i>proc</i>.AsDelegate <i>delegateType</i>]</li>
		</ul>
		<h2>Bugs fixed</h2>
		<ul>
			<li>
			The debugger now works for Meta code running in a separate thread within a 
			Windows Forms event loop.&nbsp; Previously, the event loop would trap the error 
			and display its own dialog box.
			<li>
				Misc. editor fixes</li>
		</ul>
		<hr>
		<h1><font size="3">Version 1.1 pre-&#945;</font></h1>
		<h2>New features</h2>
		<ul>
			<li>
				<b>Source-level debugging<br>
				</b>
			The debugger now highlights the current expression after breakpoints, 
			single-stepping, and exceptions.&nbsp; Individual expressions can be toggled as 
			breakpoints from the editor.
			<li>
				<b>Multithreading in the interpreter</b><br>
			The interpreter is now thread-safe.&nbsp; There is a built-in procedure, spawn, 
			which will fork off a thread to run a thunk and will properly wrap it with 
			error handlers to pop up a debugger if an error is thrown.&nbsp; Meta code can 
			also be safely called from C# code even when it isn't running in an official 
			interpreter thread, although it's up to you to catch any exceptions it 
			throws.&nbsp; Also, I would think twice about calling arbitrary user code from 
			the main GUI thread, since blocking the GUI thread effectively kills the 
			system.
			<li>
				<b>Namespace system</b><ul>
					<li>
					Unifies Meta modules and CLR namespaces
					<li>
					Dot notation for member access
					<li>
					Support for using, namespace, and export declarations.
					<li>
						Support for demand-loading of packages and DLLs from disk.</li>
				</ul>
			<li>
				<b>Generic procedures and define-method</b><br>
			Including multi-methods.&nbsp; However, no support yet for defining new CLR 
			classes from Meta.
			<li>
				<b>Tail-call optimization</b><br>
			Tail calls to interpreted code is now properly optimized, unless tail-call 
			optimization is disabled.
			<li>
				<b>Partial backward compatibility with Scheme syntax</b><br>
			Parens for s-expressions, lambda, &#955;, let, set!, and Sussman-style define.
			<li>
				<b>Support for integrating legacy vector types into Meta's primitives</b><br>
			For people doing DirectX and OpenGL hacking.
			<li>
				<b>Support for reapplying text styles to buffers or individual expressions</b></li>
		</ul>
		<h2>Incompatible changes from v1.0</h2>
		<ul>
			<li>
				<b>Namespaces are now real objects rather than strings.<br>
				</b>Consequently, using no longer accepts strings as arguments.&nbsp; Change:<br>
				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [using "System.Reflection"]<br>
				to:<br>
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [using System.Reflection]
			<li>
				<b>Vector and raster graphics operations are now in a separate package.</b><br>
				Type [using Packages.Basic2D] to use them.&nbsp; However, the constructors and 
				accessors for colors and points are still in the root namespace so they can be 
				shared with 3D packages.
			</li>
		</ul>
		<h2>Bugs fixed</h2>
		<ul>
			<li>
				<b>Unwanted editor scrolling has been reduced.</b>
			<li>
				<b>Font lock understands Sussman-style defines.</b>
			<li>
				<b>Reindentation is faster</b></li>
		</ul>
		<h2>Known bugs:</h2>
		<h3>Interpreter</h3>
		<ul>
			<li>
				<b>The interpreter is about 7% slower<br>
				</b>
			Mostly because of overhead to make it thread-safe.
			<li>
				<b>The application won't close until all spawned threads terminate</b><br>
			So if you spawn an infinite loop and close the listener window, you have to 
			kill the application from the Windows Task Manager.&nbsp; I haven't yet figured 
			out what the CLR equivalent of doing exit(0) is.
			<li>
				<b>X.Y notation is ambiguous</b><br>
			If X is a type and Y is both an instance method of X and an instance method of 
			System.Type, Meta will always return the instance method of X, rather than of 
			System.Type.&nbsp; The notation is also ambiguous when trying to access members 
			of the data object representing a namespace.
			<li>
				<b>Changing tail-call optimization doesn't change previously loaded code</b><br>
			Some would argue this is as it should be, but be advised in any case.
			<li>
				<b>Stepping into a sub-expression of a tail-call, then selecting the tail-call and 
					choosing "Continue execution to here" doesn't stop at the completion of the 
					expression</b><br>
			This isn't so much a bug as a misfeature of tail-call optimization.
			<li>
				<b>Some cases of self-recursion are unoptimized with tail-call optimization set to 
					self-recursion only<br>
				</b>Tail recursion is optimized during a static analysis pass that can't detect 
				complicated cases of self-recursion like:<br>
				&nbsp;&nbsp;&nbsp;&nbsp; [with loop : n = 10<br>
				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [[if [= n 0]<br>
				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
				identity<br>
				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
				loop]<br>
				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n]]</li>
		</ul>
		<h3>Package system</h3>
		<ul>
			<li>
				<b>Using a namespace expression in operator position has unpredictable results</b><br>
			It's illegal, but the system doesn't catch it.
			<li>
				<b>Namespace mutation isn't handled well</b><br>
				In particular, if you forget to import a namespace, get an undefined variable 
				exception the name gets added to your local namespace as a global variable with 
				no variable.&nbsp; At this point, importing the namespace doesn't solve the 
				problem because the bogus binding in the local namespace shadows the imported 
				binding.&nbsp; The simplest thing to do at this point is to say [define <i>name</i>
				<i>namespace</i>.<i>name</i>], which will copy the value from the imported 
				namespace into the current namespace.&nbsp; However, if you really need 
				namespace's copy of the variable (e.g. because some other code is modifying 
				it), you pretty much have to restart.</li>
		</ul>
		<h3>Editor</h3>
		<ul>
			<li>
				<b>The editor window scrolls annoying when editing functions that don't fit on the 
					screen.</b>
			<li>
				<b>Displaying images in the listener trashes the clipboard</b>
			<li>
				<b>Images in Meta files are stored as uncompressed RTF bitmaps</b><br>
			I'm trying to find work-arounds for these.
			<li>
				<b>Reindent is slow</b>
			<li>
				<b>Undo doesn't work well</b>
			<li>
				<b>Undo turns off when buffer reaches 50K<br>
				</b>
			This is because undo is implemented as a kluge on top of a low-level editor 
			that doesn't support it.
			<li>
				<b>No good way to move back to normal mode after subscripting or superscripting</b><br>
				It could be that I'm doing something stupid, but setting SelectionCharOffset to 
				a zero doesn't seem to unshrink the font.</li>
		</ul>
		<h3>Other</h3>
		<ul>
			<li>
				<b>Apropos only finds names in the current package and its imports.</b>
			<li>
				<b>Apropos misses most types in native CLR namespaces</b>
			<li>
				<b>Apropos misses unloaded packages</b></li>
		</ul>
	</body>
</html>
